18.3 Kontextmenüs
 
Kontextmenüs werden angezeigt, wenn der Anwender mit der rechten Maustaste auf die Form oder ein Steuerelement klickt. Er kann danach aus einer Liste eine der für diese Komponente angebotenen Optionen wählen. Ein Kontextmenü ist einfacher zu entwickeln als ein herkömmliches Menü, da ein Hauptmenü nicht erforderlich ist und ein Kontextmenü nur selten eine tiefere Gliederung hat. Kontextmenüs werden durch das Steuerelement ConextMenustrip beschrieben, dass Sie einfach durch Doppelklick der Form hinzufügen. Sie können der Form mehrere Kontextmenüs hinzufügen, da sich in der Regel die Kontextmenüs der einzelnen Komponenten unterscheiden. Die Zuordnung eines Kontextmenüs zu einem bestimmten Steuerelement erfolgt über die Eigenschaft ContextMenuStrip des jeweiligen Controls.
Einige Steuerelemente besitzen bereits ein eingebautes Kontextmenü, beispielsweise die Textbox. Weisen Sie einem solchem Steuerelement ein benutzerdefiniertes Kontextmenü zu, wird das eingebaute ausgeblendet. Diese Tatsache können Sie sich zunutze machen, um ein unerwünschtes Kontextmenü vollständig auszublenden. Andererseits hat das Ausblenden unter Umständen auch den Nebeneffekt, dass Sie zwar gerne das eingebaute Kontextmenü nutzen, aber dessen Fähigkeiten ergänzen wollen. Ihnen bleibt es dann nicht erspart, das Verhalten des ausgeblendeten Kontextmenüs selbst zu programmieren.
Die Menüelemente eines Kontextmenüs sind vom Typ ToolStripMenuItem. Dieser Typ wurde weiter oben schon genauer beschrieben. Wir können uns daher an dieser Stelle eine Wiederholung des Gesagten ersparen.
18.3.1 Das Standardverhalten eines Kontextmenüs ändern
 
Wollen Sie vom Standardverhalten abweichen und das Öffnen eines Kontextmenüs einem anderen Ereignis zuordnen oder das Kontextmenü an einer anderen als der standardmäßig vordefinierten Position anzeigen lassen, müssen Sie die Anzeige mit der Show-Methode des ContextMenuStrip-Objekts einleiten:
| public void Show(Control control, Point pos);
|
Dem Aufruf wird im ersten Parameter die Referenz auf die Windows-Komponente übergeben, der das Kontextmenü zugeordnet werden soll. Der zweite Parameter erwartet die Angabe der Koordinaten, an denen das Menü angezeigt werden soll. Es handelt sich dabei um die Koordinaten relativ zu dem im ersten Parameter angeführten Steuerelement.
Angenommen Sie beabsichtigen, das Kontextmenü einer Form nicht an der Spitze der Mauszeigerposition, sondern im Ursprungspunkt der Form zu öffnen, lautet die Anweisung dazu wie folgt:
| contextMenuStrip1.Show(this, new Point(0, 0);
|
Dabei sei contextMenuStrip1 die Referenz auf ein ContextMenuStrip-Objekt. Jetzt muss noch überlegt werden, welches Ereignis sich für die Anzeige des Kontextmenüs eignet. Üblicherweise handelt es sich dabei um das Ereignis MouseUp, das ausgelöst wird, wenn eine der Maustasten losgelassen wird. Natürlich kann man auch ein beliebiges anderes Ereignis wählen. Inwieweit das allerdings sinnvoll ist, sei dahingestellt. MouseUp ist vom Typ MouseEventHandler. Die Definition lautet:
| public event MouseEventHandler MouseUp;
|
Der Ereignishandler empfängt ein Objekt vom Typ MouseEventArgs mit Daten zum Ereignis. Dazu gehört auch die Eigenschaft Button:
| public MouseButtons Button {get;}
|
Die Aufzählung MouseButtons enthält unter anderem drei Konstanten, welche die drei Maustasten beschreiben: Left, Middle und Right. Im Ereignishandler des MouseUp-Events muss nur geprüft werden, welche Maustaste den Aufruf verursacht hat. Handelt es sich um die rechte Maustaste, wird die Methode Show des ContextMenuStrip-Objekts unter Übergabe der gewünschten Argumente aufgerufen.
| private void Form1_MouseUp(object sender, MouseEventArgs e) {
|
| if(e.Button == MouseButtons.Right)
|
| contextMenuStrip1.Show(this, new Point(0,0));
|
| }
|
18.3.2 Ereignisse des Kontextmenüs
 
Öffnet ein Anwender mit der üblicherweise rechten Maustaste das Kontextmenü einer Komponente, treten zwei Ereignisse auf: Opening, bevor das Kontextmenü geöffnet wird, und Opened direkt nach dem Öffnen. Damit verhalten sich beide Ereignisse genauso wie die Ereignisse DropDownOpening und DropDownOpened eines ToolStripMenuItem-Objekts.
Im ersten Moment erscheint es so, als wären die Ereignisse identisch. Dennoch gibt es einen Unterschied: Der zweite Parameter von Opening ist vom Typ CancelEventArgs und ermöglicht über die Eigenschaft Cancel, das eingeleitete Öffnen des Kontextmenüs aufgrund gewisser Umstände abzubrechen. Dazu ist e.Cancel=true zu setzen. Diese Möglichkeit bietet DropDownOpening nicht.
18.3.3 Das Kontextmenü einer Textbox
 
Eine Textbox nimmt eine besondere Stellung ein: Standardmäßig bietet sie zur Laufzeit ein Kontextmenü an, das unter anderen auch die Optionen zum Ausschneiden, Kopieren, Einfügen und Löschen enthält. Sobald eine Textbox jedoch mit einem benutzerdefinierten Kontextmenü verbunden wird, stehen diese Auswahlmöglichkeiten nicht mehr zur Verfügung und sollten daher zusätzlich implementiert werden.
Die genannten Operationen benutzen die Zwischenablage als Medium zum Datenaustausch. Natürlich können wir uns der Methoden Cut, Copy und Paste der Textbox bedienen, um zum gewünschten Ergebnis zu kommen. Aber andererseits bietet es sich auch an, an dieser Stelle intensiver auf die Zwischenablage einzugehen, um am Ende die Interaktionen zwischen Textbox und Zwischenablage auf elementarer Basis zu programmieren. |